from aiogram import Bot, Dispatcher
from aiogram.filters import Text
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import any_state
from aiogram.types import Message, ReplyKeyboardRemove
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import sessionmaker

from app.bot.keyboards.reply import user_keyboard
from app.bot.states.states import GenerateDocument
from app.bot.utils.logger import log
from app.bot.utils.scheduler import jobs
from app.database.functions.document import add_document
from app.database.functions.stats import update_stats, update_user_stats


async def generate_docs(message: Message, state: FSMContext) -> None:
    """
    Генератор документов
    """

    txt = (
        f"В этом разделе вы можете сгенерировать украинские водительские права\n"
        f"Для начала отправьте мне имя и фамилию для документа\n"
    )
    await message.answer(txt, reply_markup=ReplyKeyboardRemove())
    await message.answer("Отправьте /cancel, чтобы вернуться в главное меню")
    await state.set_state(GenerateDocument.waiting_name)


async def doc_name(message: Message, state: FSMContext) -> None:
    await state.update_data(fullname=message.text)
    await message.answer("Теперь введите город")
    await state.set_state(GenerateDocument.waiting_city)


async def doc_city(
    message: Message,
    bot: Bot,
    session: AsyncSession,
    session_factory: sessionmaker,
    scheduler: AsyncIOScheduler,
    state: FSMContext,
) -> None:

    await state.update_data(city=message.text)
    data = await state.get_data()
    await add_document(
        session, message.from_user.id, data.get("fullname"), data.get("city")
    )
    await message.answer("Задача принята в работу", reply_markup=user_keyboard())
    await state.clear()

    scheduler.add_job(
        jobs.check_docs,
        "interval",
        name="Documents",
        seconds=30,
        args=(bot, session_factory, scheduler, message.from_user.id),
    )
    log.info(f"Добавлена задача по документу от пользователя {message.from_user.id}")
    await update_stats(session, documents=1)
    await update_user_stats(session, message.from_user.id, documents_generated=1)


def register_documents_handlers(dp: Dispatcher):
    dp.message.register(
        generate_docs, Text(text="📄 Генератор документов", ignore_case=True), any_state
    )
    dp.message.register(doc_name, GenerateDocument.waiting_name)
    dp.message.register(doc_city, GenerateDocument.waiting_city)
